/*
 * @Date: 2022-09-26 20:16:35
 * @LastEditors: 超市椰羊
 * @LastEditTime: 2022-09-30 20:29:28
 * @Description: 可以发送"群管帮助"查看指令
 */
import plugin from '../../lib/plugins/plugin.js'
import fetch from 'node-fetch'
import { segment } from "oicq";
import cfg from '../../lib/config/config.js';
import fs from 'fs'


//定义多少等级同意加群申请
const setlevel = 12 //设置审核等级
//因为QQ自带自动审核但不会拒绝申请这里主要针对拒绝，按需开启
const openGroup = [123, 123]//开启的群聊
//如果你安装了小雪plugin默认这个插件的禁言和解禁都是禁用的
const forbidden = true //如需开启改为false


export class Basics extends plugin {
    constructor() {
        super({
            name: '群管',
            /** 功能描述 */
            dsc: '基础群管',
            /** https://oicqjs.github.io/oicq/#events */
            event: 'message',
            /** 优先级，数字越小等级越高 */
            priority: 5000,
            rule: [
                {
                    /** 命令正则匹配 */
                    reg: '^#?禁言.*$',
                    /** 执行方法 */
                    fnc: 'Taboo'
                },
                {
                    /** 命令正则匹配 */
                    reg: '^#?解禁.*$',
                    /** 执行方法 */
                    fnc: 'Relieve'
                },
                {
                    /** 命令正则匹配 */
                    reg: '^#?全体(禁言|解禁)$',
                    /** 执行方法 */
                    fnc: 'TabooAll'
                },
                {
                    /** 命令正则匹配 */
                    reg: '^#踢(.*)$',
                    /** 执行方法 */
                    fnc: 'Kick'
                },
                {
                    /** 命令正则匹配 */
                    reg: '^#?群管帮助$',
                    /** 执行方法 */
                    fnc: 'help'
                },
                {
                    /** 命令正则匹配 */
                    reg: '^#?群管帮助$',
                    /** 执行方法 */
                    fnc: 'help'
                },
                {
                    /** 命令正则匹配 */
                    reg: '^#?我要自闭.*$',
                    /** 执行方法 */
                    fnc: 'Autistic'
                },
                {
                    /** 命令正则匹配 */
                    reg: '^#?(设置|取消)管理.*$',
                    /** 执行方法 */
                    fnc: 'SetAdmin'
                },
                {
                    /** 命令正则匹配 */
                    reg: '^#?(允许|禁止|开启|关闭)匿名$',
                    /** 执行方法 */
                    fnc: 'AllowAnony'
                },
                {
                    /** 命令正则匹配 */
                    reg: '^#?发群公告.*$',
                    /** 执行方法 */
                    fnc: 'Announce'
                },
                {
                    /** 命令正则匹配 */
                    reg: '^#?查群公告$',
                    /** 执行方法 */
                    fnc: 'DelAnnounce'
                },
                {
                    /** 命令正则匹配 */
                    reg: '^#?删群公告.*$',
                    /** 执行方法 */
                    fnc: 'DelAnnounce'
                },
            ]
        })
        this.path = "./plugins/xiaoxue-plugin"
    }
    async help(e) {
        let msg = [
            segment.image("https://api.ixiaowai.cn/api/api.php"),
            "基础群管 by 超市椰羊 \n",
            "--------------------\n",
            "#禁言 <@群员> <时间> \n",
            "#解禁 <@群员> \n",
            "#全体禁言 \n",
            "#全体解禁 \n",
            "#允许匿名 \n",
            "#禁止匿名 \n",
            "#踢 <@群员> \n",
            "#我要自闭 <时间> \n",
            "#设置管理 <@群员> \n",
            "#取消管理 <@群员> \n",
            "#发群公告 <内容> \n",
            "#查群公告 \n",
            "#删群公告 <序号> \n",
            "Tip:@群员可以用QQ号代替\n踢群员防止误触发必须加#"
        ]
        e.reply(msg)

    }
    /**禁言 */
    async Taboo(e) {
        if (!e.isGroup) return;

        if (forbidden) {
            if (fs.existsSync(this.path)) return
        }

        if (e.isMaster || e.member.is_owner || e.member.is_admin) {

            let qq;
            let TabooTime;
            let Company;
            //判断有无@
            if (e.message.length == 1) {
                //处理消息
                let msg = e.msg.split(" ");
                if (msg.length >= 4) return e.reply("❎ 指令有误请检查");
                //取qq号
                if (msg.length == 1) {
                    qq = msg[0].match(/[1-9]\d*/g);
                } else if (msg.length == 2) {
                    qq = msg[0].match(/[1-9]\d*/g);
                    if (!qq) qq = msg[1].match(/[1-9]\d*/g);
                } else {
                    qq = msg[1].match(/[1-9]\d*/g);
                }
                //取禁言时间如果没取到走默认时间
                if (msg[2]) {
                    TabooTime = msg[2].match(/[1-9]\d*/g);
                    Company = msg[2].match(/(天|时|分)/g);
                } else if (msg.length == 2 && qq) {
                    TabooTime = msg[1].match(/[1-9]\d*/g);
                    Company = msg[1].match(/(天|时|分)/g);
                }

            } else {
                //有艾特处理
                for (let i of e.message) {
                    //取信息中艾特的QQ号
                    if (i.type == "at") {
                        qq = i.qq;
                    } else if (i.type == 'text') {
                        //取禁言时间
                        if (/\d/g.test(i.text)) {
                            TabooTime = i.text.match(/[1-9]\d*/g);
                            Company = i.text.match(/(天|时|分)/g);
                        }
                    }
                }
            }

            if (!(/\d{5,}/.test(qq))) return e.reply("❎ 请输入正确的QQ号");
            //判断是否有这个人
            let memberMap = await e.group.getMemberMap();
            memberMap = Array.from(memberMap.keys());
            if (!memberMap.includes(Number(qq))) return e.reply("❎ 这个群没有这个人哦~");
            //如无时间默认禁言五分钟
            if (!TabooTime) TabooTime = 5;
            //默认单位为分
            if (/天/.test(Company)) {
                Company = 86400;
            } else if (/时/.test(Company)) {
                Company = 3600;
            } else {
                Company = 60;
            }

            //判断是否有管理
            if (Bot.pickGroup(e.group_id).is_admin || Bot.pickGroup(e.group_id).is_owner) {
                await e.group.muteMember(qq, TabooTime * Company);
                e.reply(`已把${e.group.pickMember(qq).card}扔进了小黑屋~`);
                return true;
            } else {
                return e.reply("❎ 没有管理员人家做不到啦~>_<");
            }
        }
    }
    /**解禁 */
    async Relieve(e) {
        if (!e.isGroup) return;
        if (forbidden) {
            if (fs.existsSync(this.path)) return
        }

        if (e.isMaster || e.member.is_owner || e.member.is_admin) {
            let qq = e.message[0].text.replace(/#|解禁/g, "").trim();

            if (e.message[1]) {
                qq = e.message[1].qq;
            } else {
                qq = qq.match(/[1-9]\d*/g);
            }

            if (!(/\d{5,}/.test(qq))) return e.reply("❎ 请输入正确的QQ号");
            //判断是否有这个人
            let memberMap = await e.group.getMemberMap();
            memberMap = Array.from(memberMap.keys());
            if (!memberMap.includes(Number(qq))) return e.reply("❎ 这个群没有这个人哦~");
            //判断是否有管理
            if (Bot.pickGroup(e.group_id).is_admin || Bot.pickGroup(e.group_id).is_owner) {
                await e.group.muteMember(qq, 0)
                e.reply(`轻轻的把${e.group.pickMember(qq).card}从小黑屋揪了出来~`);
                return true;
            } else {
                return e.reply("❎ 没有管理员人家做不到啦~>_<");
            }
        }
    }
    /**全体禁言 */
    async TabooAll(e) {
        if (!e.isGroup) return;
        if (e.isMaster || e.member.is_owner || e.member.is_admin) {

            let res = false;
            if (/全体禁言/.test(e.msg)) res = true;
            //判断是否有管理
            if (Bot.pickGroup(e.group_id).is_admin || Bot.pickGroup(e.group_id).is_owner) {
                await e.group.muteAll(res)
                if (res) {
                    e.reply("全都不准说话了哦~")
                } else {
                    e.reply("好耶！！可以说话啦~")
                }
                return true
            } else {
                return e.reply("❎ 没有管理员人家做不到啦~>_<");
            }
        }
    }
    //踢群员 防止误触发必须加#号
    async Kick(e) {
        if (!e.isGroup) return
        if (e.isMaster || e.member.is_owner || e.member.is_admin) {
            let qq = e.message[0].text.replace(/#|踢/g, "").trim()

            if (e.message[1]) {
                qq = e.message[1].qq
            } else {
                qq = qq.match(/[1-9]\d*/g)
            }
            if (!(/\d{5,}/.test(qq))) return e.reply("❎ 请输入正确的QQ号");
            //判断是否有这个人
            let memberMap = await e.group.getMemberMap()
            memberMap = Array.from(memberMap.keys())
            if (!memberMap.includes(Number(qq))) return e.reply("❎ 这个群没有这个人哦~")
            //判断是否有管理
            if (Bot.pickGroup(e.group_id).is_admin || Bot.pickGroup(e.group_id).is_owner) {
                await e.group.kickMember(qq)
                e.reply("已把这个坏淫踢掉惹！！！")
                return true
            } else {
                return e.reply("❎ 没有管理员人家做不到啦~>_<");
            }
        }
    }
    //我要自闭
    async Autistic(e) {
        if (!e.isGroup) return
        if (e.member.is_admin || e.member.is_owner || e.isMaster)
            return e.reply("别自闭啦~~", true)


        let msg = e.msg.replace(/#|我要自闭/g, "").trim()
        let TabooTime = msg.match(/[1-9]\d*/g);
        let Company = msg.match(/(天|时|分)/g);
        //如无时间默认禁言五分钟
        if (!TabooTime) TabooTime = 5;
        //默认单位为分
        if (/天/.test(Company)) {
            Company = 86400;
        } else if (/时/.test(Company)) {
            Company = 3600;
        } else {
            Company = 60;
        }

        //判断是否有管理
        if (Bot.pickGroup(e.group_id).is_admin || Bot.pickGroup(e.group_id).is_owner) {
            await e.group.muteMember(e.user_id, TabooTime * Company);
            e.reply(`那我就不手下留情了~`);
            return true;
        } else {
            return e.reply("那你快自闭吧~", true);
        }
    }

    //设置管理
    async SetAdmin(e) {
        if (!Bot.pickGroup(e.group_id).is_owner) return e.reply("呜呜呜，人家做不到>_<")
        if (!e.isMaster) return e.reply("❎ 该命令仅限管理员可用", true);
        let qq
        let yes = false
        qq = e.msg.replace(/#|(设置|取消)管理/g, "").trim();
        if (/设置管理/.test(e.msg)) yes = true

        if (e.message[1]) {
            qq = e.message[1].qq;
        } else {
            qq = qq.match(/[1-9]\d*/g);
        }

        if (!(/\d{5,}/.test(qq))) return e.reply("❎ 请输入正确的QQ号");
        //判断是否有这个人
        let memberMap = await e.group.getMemberMap();
        memberMap = Array.from(memberMap.keys());
        if (!memberMap.includes(Number(qq))) return e.reply("❎ 这个群没有这个人哦~");

        await e.group.setAdmin(qq, yes)
        if (yes) {
            e.reply(`已经把${e.group.pickMember(qq).card}设置为管理啦！！`)
        } else {
            e.reply(`${e.group.pickMember(qq).card}的管理已经被我吃掉啦~`)
        }
    }

    //匿名
    async AllowAnony(e) {
        if (e.isMaster || e.member.is_owner || e.member.is_admin) {
            let yes = false
            if (/(允许|开启)匿名/.test(e.msg)) {
                yes = true
            }
            //判断是否有管理
            if (Bot.pickGroup(e.group_id).is_admin || Bot.pickGroup(e.group_id).is_owner) {
                await e.group.allowAnony(yes)
                if (yes) {
                    e.reply("已把匿名开启了哦，可以藏起来了~")
                } else {
                    e.reply("已关闭匿名，小贼们不准藏了~")
                }
                return true;
            } else {
                return e.reply("呜呜呜，人家做不到>_<~");
            }
        }
    }

    //发群公告
    async Announce(e) {
        if (e.isMaster || e.member.is_owner || e.member.is_admin) {
            let msg = e.msg.replace(/#|发群公告/g, "").trim()

            if (!msg) e.reply("❎ 公告不能为空");

            if (Bot.pickGroup(e.group_id).is_admin || Bot.pickGroup(e.group_id).is_owner) {
                let ck = getck()
                let url = `https://xiaobai.klizi.cn/API/qqgn/gg_send.php?data=&skey=${ck.skey}&pskey=${ck.p_skey}&uin=${cfg.qq}&group=${e.group_id}&text=${msg}`

                let result = await fetch(url).then(res => res.json()).catch(err => console.log(err))
                if (!result) return e.reply("❎ 接口出错")

                if (result.ec == 0) {
                    e.reply("✅ 已发送群公告，群员们要好好看哦~")
                } else {
                    e.reply("❎ 发送失败")
                }
                return true;
            } else {
                return e.reply("呜呜呜，人家做不到>_<~");
            }
        }
    }

    //查群公告+删群公告
    async DelAnnounce(e) {
        if (e.isMaster || e.member.is_owner || e.member.is_admin) {

            if (/查群公告/.test(e.msg)) {
                let res = await this.getAnnouncelist(e.group_id)
                if (res) await e.reply(res)
                return;
            }
            if (Bot.pickGroup(e.group_id).is_admin || Bot.pickGroup(e.group_id).is_owner) {
                let msg = e.msg.replace(/#|删群公告/, "").trim()

                if (!msg) return e.reply(`❎ 序号不可为空`)

                msg = msg.match(/\d/)

                if (!msg) return e.reply(`❎ 请检查序号是否正确`)

                let ck = getck()

                let list = await this.getAnnouncelist(e.group_id, msg)

                let url = `https://xiaobai.klizi.cn/API/qqgn/gg_delete.php?data=&skey=${ck.skey}&pskey=${ck.p_skey}&uin=${cfg.qq}&group=${e.group_id}&fid=${list.fid}`

                let result = await fetch(url).then(res => res.json())
                    .catch(err => console.log(err))

                if (!result) return e.reply("❎ 接口出错")
                if (result.ec == 0) {
                    e.reply("✅ 已删除这个公告哦~")
                } else {
                    e.reply("❎ 删除失败")
                }
            } else {
                return e.reply("呜呜呜，人家做不到>_<~");
            }
        }
    }
    async getAnnouncelist(group, item = "") {

        let ck = getck()

        let url = `https://xiaobai.klizi.cn/API/qqgn/qun_gg.php?data=&skey=${ck.skey}&pskey=${ck.p_skey}&uin=${cfg.qq}&group=${group}&n=${item}`

        let result = await fetch(url).then(res => res.text()).catch(err => console.log(err))

        if (!result) return false

        if (item) {
            return JSON.parse(result)
        } else {
            return result
        }

    }
}

/**自动审核 */
export class Examine extends plugin {
    constructor() {
        super({
            name: '群管',
            /** 功能描述 */
            dsc: '自动审核',
            /** https://oicqjs.github.io/oicq/#events */
            event: 'request.group.add',
            /** 优先级，数字越小等级越高 */
            priority: 5000,
        })
    }

    async accept(e) {
        if (!openGroup.includes(e.group_id)) return;
        if (!setlevel) return;

        if (Bot.pickGroup(e.group_id).is_admin || Bot.pickGroup(e.group_id).is_owner) {
            let url = `https://api.linhun.vip/api/Qlevel?qq=${e.user_id}`
            let res = await fetch(url)
                .then(res => res.json())
                .catch(err => console.log(err))
            let yes = false
            if (!res) return logger.error("接口失效")
            if (res.Level >= setlevel) yes = true
            if (yes) {
                logger.info("已同意")
            } else {
                logger.info("已拒绝")
            }
            e.approve(yes)
        } else return
    }
}



/**取cookies */
function getck() {
    let cookie = Bot.cookies['qun.qq.com']
    let ck = cookie.replace(/=/g, `":"`).replace(/;/g, `","`).replace(/ /g, "").trim()
    ck = ck.substring(0, ck.length - 2)
    ck = `{"`.concat(ck).concat("}")
    return JSON.parse(ck)
}